package com.company.bs2021;

/**
 * 2．猫午睡问题（18分)
 * <p>问题描述:
 * <p>假设两只猫住在一起,都喜欢睡觉，它们每小时都会循环地更换午睡的地方。现在给定n个可以睡觉的位置:
 *  <ul>
 *  <li>猫A按顺序更换它的午睡地:n,n-1,n一2,…,3,2,1,n,n-1,…，换句话说，在第1个小时里，它在n的
 *  位置上，然后按顺序循环递减。
 *
 *  <li>猫B按顺序改变它的午睡地点:1,2,3,…,n-1,n,1,2,…，换句话说，在第1个小时里，它在1的位置上，
 *  然后以循环的方式递增。</li>
 *  </ul>
 *  <p>猫B比猫A要年轻得多，所以它们有严格的等级制度。A和B不能同时在一个位置上睡觉。换句话说，当某
 *  个小时的开始时刻，如果两只猫将要去睡觉的位置相同（例如x号位置〉，那么A将会占用这个位置睡觉，而B
 *  必须按它的顺序挪到下一个位置去睡觉（如果x小于n，就到x+1，但如果x=n，就到1）。
 *
 *  <p>试计算一下，猫B在第k小时的开始时刻将占用哪个位置睡觉?
 * <p>
 * 要求:
 * 完成题目对应的程序模板(CatSleeping）中的方法:int findPosition(int n, int k);
 * 该方法的入口参数n为两个猫睡觉的位置总数，参数k为第k 小时的开始时刻;
 * 最后输出结果为猫B在第k小时的开始时刻所能占用的位置
 * <p>
 * 提示:
 * 2<=n<= 10^9
 * 1 <=k <= 10^9
 * <p>
 * 样例;
 *  样例1
 *   输入:n = 4,k = 2
 *   输出:2
 *   解释:第1个小时的开始时刻，猫B移到位置1睡觉，第2个小时的开始时刻，按照顺序，猫B将移到位置2睡觉，所以输出结果为2
 * <p>
 *  样例2
 *   输入:n = 3,k = 2
 *   输出:3
 *   解释:第2个小时的开始时刻，猫A和猫B都来到了位置2，按照等级，猫B必须让出位置2，前往位置3睡觉，所以输出结果为3
 *
 * @author jianf
 * @date 2022年07月06 17:00
 */
public class CatSleeping {

    /*int findPosition(int n, int k) {

        int pos = 0;

        // 此时位置为双数，不会撞车
        if ( n%2 ==0){
            pos = k%n;
        }else {
            k = k +(2*k/n);
            pos = k%n;
        }
        return pos ==0 ? n: pos;
    }*/

    int findPosition(int n, int k) {

        int pos = 0;
        int aPos=n+1,bPos=0;
        for (int i = 1; i <=k ; i++) {
            aPos--;
            bPos++;
            if( aPos <1){
                aPos =n;
            }
            if(bPos> n){
                bPos =bPos%n;
            }
            //如果撞车，B猫加1，A猫不动
            while (aPos == bPos){
                bPos++;
                if( aPos <1){
                    aPos =n;
                }
                if(bPos> n){
                    bPos =bPos%n;
                }
            }
            System.out.printf("第%d小时的位置，A猫=%d,B猫=%d\n",i,aPos,bPos);
        }

        return bPos;
    }

    public static void main(String[] args) {
        int n = 5, k = 8;
        CatSleeping cs = new CatSleeping();
        System.out.println(cs.findPosition(n, k));
        System.out.println(cs.getipInt("10.0.3.193"));
        System.out.println(cs.getIntIp(167773121));
    }

    int getipInt(String ip){
        int part = 1;
        String[] ips = ip.split("\\.");
        int res = 0;
        for(int i = 3 ;i>=0;i--){
            res += Integer.valueOf(ips[i])*part;
            part *=256;
        }
        return res;
    }

    String getIntIp(int ip){
        int part = 256*256*256;
        String res = "";
        for(int i = 0 ;i<4;i++){
            int tmp = ip/part;
            res += tmp +"";
            ip -= tmp *part;
            part /=256;
            if(i<3)
                res +=".";
        }
        return res;
    }
}
